const toString = Object.prototype.toString

export function isDate(val: any): val is Date {  //val is Date 是 TypeScript 的类型谓词，意味着若函数返回 true，TypeScript 编译器会认定 val 是 Date 类型。
  return toString.call(val) === '[object Date]'
}

// export function isObject(val: any): val is Object {
//   return val !== null && typeof val === 'object'
// }

// 判断一个值是否为 纯对象（即通过 {} 或 new Object() 创建的普通对象，排除数组（[]）、日期（Date）、正则（RegExp）、函数（Function）等）。
export function isPlainObject(val: any): val is Object {
  return toString.call(val) === '[object Object]'
}

export function isFormData(val: any): val is FormData {
  return typeof val !== 'undefined' && val instanceof FormData
}

export function isURLSearchParams(val: any): val is URLSearchParams {
  return typeof val !== 'undefined' && val instanceof URLSearchParams
}

// 对象扩展函数（合并两个对象）
export function extend<T, U>(to: T, from: U): T & U {
  for (const key in from) {// 遍历 from 对象的所有属性名（key）
    ; (to as T & U)[key] = from[key] as any// 将 from 的属性复制到 to 上
  }
  return to as T & U
}


export function deepMerge(...objs: any[]): any { //核心：对象递归合并，非对象直接覆盖，后输入的优先。
  const result = Object.create(null)// 创建无原型的空对象（避免原型污染）

  objs.forEach(obj => {
    if (obj) { // 跳过 null/undefined（若传入 undefined，合并时会被忽略）
      Object.keys(obj).forEach(key => {  // 遍历当前对象obj的所有键
        const val = obj[key]      // 获取当前键对应的值
        if (isPlainObject(val)) {// 若值是「普通对象」（如 {a: 1}，非数组/函数等）
          if (isPlainObject(result[key])) {
            // 结果对象中已有该键，且也是普通对象 → 递归深度合并
            result[key] = deepMerge(result[key], val)
          } else {
            // 结果对象中无该键，或该键对应的值不是对象 → 直接合并val（可能是新对象或递归合并）
            result[key] = deepMerge(val)
          }
        } else {// 若值不是普通对象（如字符串、数字、数组、null等）→ 直接赋值（后面的对象会覆盖前面的）
          result[key] = val
        }
      })
    }
  })

  return result
}